package com.travelsmart.client.apresentacao.widget;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.KeyboardListener;
import com.google.gwt.user.client.ui.Widget;
import com.travelsmart.client.apresentacao.i18n.I18nMessages;

/**
 * o componente DialogBox, que permite mostrar janelas popup com informações ou
 * avisos. A classe que estende DialogBox, para aproveitar características desse
 * componente, como área de título, a possibilidade de arrastá-lo e sua
 * característica modal (enquanto a janela estiver ativa o restante da aplicação
 * fica bloqueado).
 * 
 * @author arthur
 * 
 */
public class FormDialogBox extends DialogBox {

	private final static String TAMANHO_JANELA = "400px";

	/**
	 * no construtor foi definido o título, o tamanho e a localização da caixa
	 * de diálogo. A imagem, o conteúdo e o botão foram posicionados dentro de
	 * um componente DockPanel. Para entender mais sobre painéis como este e
	 * outros componentes gráficos do GWT, veja o site
	 * "http://code.google.com/intl/webtoolkit/webtoolkit/doc/latest/RefWidgetGallery.html"
	 * .
	 * 
	 * @param imagem
	 * @param titulo
	 * @param conteudo
	 */
	public FormDialogBox(Image imagem, String titulo, Widget conteudo) {
		setText(titulo);
		// posicao do DialogBox
		this.setPopupPosition(Window.getClientWidth() / 3, 30);
		// pode-se definir a unidade, por exemplo px ou em
		setWidth(TAMANHO_JANELA);
		/*
		 * Criando o botão para fechar o DialogBox, e o seu listener Obs: Note que na criação do botão de fechar já instanciamos um ClickHandler,
		 * que no evento de clique (onClick()) fechará a caixa de diálogo através do método hide(), herdado da superclasse.
		 */
		Button btnFechar = new Button("<span id='botao_fechar_dialog_box'>" + I18nMessages.INSTANCE.fechar() + "</span>",
				new ClickHandler() {
					@Override
					public void onClick(ClickEvent event) {
						hide();
					}
				});
		// cria um DockPanel e define o layout do DialogBox
		DockPanel panelBase = new DockPanel();
		if (imagem != null) {
			panelBase.add(imagem, DockPanel.WEST);
		}
		panelBase.add(btnFechar, DockPanel.SOUTH);
		panelBase.add(conteudo, DockPanel.CENTER);
		// configura a distância entre os componentes deste panel
		panelBase.setSpacing(4);
		// configura o conteudo do DialogBox como sendo o DockPanel
		add(panelBase);
	}

	/**
	 * trata dos eventos do teclado, define que ao pressionar Enter ou Esc a
	 * caixa de diálogo seja fechada, também usando hide().
	 */
	public boolean onKeyDownPreview(char key, int modifiers) {
		// caso o usuário tecle ESC ou ENTER o DialogBox se fechará
		switch (key) {
		case KeyboardListener.KEY_ENTER:
		case KeyboardListener.KEY_ESCAPE:
			hide();
			break;
		}
		return true;
	}

}
